﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.IO;

using OpenCvSharp;
using OpenCvSharp.MachineLearning;
using OpenCvSharp.Blob;
using OpenCvSharp.UserInterface;
using OpenCvSharp.CPlusPlus;
using System.Xml;
using System.Xml.Serialization;


namespace RecognitionNumbers
{
    public partial class Form1 : Form
    {
        public НастройкиПоискНомера настройкиПоискНомера;
        public НастройкиПоискаСимволов настройкиПоискСимволов;
        public Image исходноеИзображение;
        public SearchRectangle поискПрямоугольника;
        public SearchSymbol поискСимволов;
        public List<MatrixSymbol> матрицыСимволов;

        public Form1()
        {
            InitializeComponent();
            настройкиПоискНомера = new НастройкиПоискНомера();
            настройкиПоискСимволов = new НастройкиПоискаСимволов();
            XmlSerializer xml;
            FileStream stream;
            if (File.Exists("НастройкиПоискНомера.xml"))
            {
                xml = new XmlSerializer(typeof(НастройкиПоискНомера));
                stream = new FileStream("НастройкиПоискНомера.xml", FileMode.Open, FileAccess.Read);
                настройкиПоискНомера = (НастройкиПоискНомера)xml.Deserialize(stream);
                stream.Close();
            }
            else
            {
                настройкиПоискНомера.название = "Поиск номера";
                настройкиПоискНомера.описание = "Поиск изображения на фото которое может быть номерным знаком";
                настройкиПоискНомера.порогБинаризации = 125;
                настройкиПоискНомера.процентЦветных = 20;
                настройкиПоискНомера.процентЧерногоВерх = 80;
                настройкиПоискНомера.процентЧерногоНиз = 20;
                настройкиПоискНомера.соотношениеСторон = 2.5;
                настройкиПоискНомера.отклонениеСторон = 20;
            }

            if (File.Exists("НастройкиПоискаСимволов.xml"))
            {
                xml = new XmlSerializer(typeof(НастройкиПоискаСимволов));
                stream = new FileStream("НастройкиПоискаСимволов.xml", FileMode.Open, FileAccess.Read);
                настройкиПоискСимволов = (НастройкиПоискаСимволов)xml.Deserialize(stream);
                stream.Close();
            }
            else
            {
                настройкиПоискСимволов.название = "Поиск символов";
                настройкиПоискСимволов.описание = "Поиск изображения на фото которое может быть символом номерного знака";
                настройкиПоискСимволов.порогБинаризации = 125;
                настройкиПоискСимволов.отклонениеРазмер = 100;
                настройкиПоискСимволов.радиус = 1;
                настройкиПоискСимволов.размер = 1;
                настройкиПоискСимволов.соотношениеСторон = 0.8;
                настройкиПоискСимволов.отклонениеСторон = 20;
            }
            if (File.Exists("Матрицы.xml"))
            {
                xml = new XmlSerializer(typeof(List<MatrixSymbol>));
                stream = new FileStream("Матрицы.xml", FileMode.Open, FileAccess.Read);
                матрицыСимволов = (List<MatrixSymbol>)xml.Deserialize(stream);
                stream.Close();
            }
            else
            {
                матрицыСимволов = new List<MatrixSymbol>();
                char[] lN = { 'А', 'В', 'Е', 'К', 'М', 'Н', 'О', 'Р', 'С', 'Т', 'У', 'Х', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                foreach (char t in lN)
                {
                    MatrixSymbol m = new MatrixSymbol();
                    m.symbol = t;
                    m.clear();
                    матрицыСимволов.Add(m);

                }

            }



        }

        private void button2_Click(object sender, EventArgs e)
        {


        }

        private void fotoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Symbol п = new Symbol();
            openFileDialog1.ShowDialog();
            label1.Visible = false;

            pictureBox2.Visible = false;


            if (File.Exists(openFileDialog1.FileName))
            {

                исходноеИзображение = new Image(openFileDialog1.FileName);
                Обработка(исходноеИзображение);

            }
        }

        private void фильтрыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Фильтры фильтры = new Фильтры(this);
            фильтры.Show();
        }

        private void файлToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

   

        public void Обработка(Image исходнаКартинка)
        {
            toolStripStatusLabel2.Text = "";
            DateTime time = DateTime.Now;
            поискПрямоугольника = new SearchRectangle(исходнаКартинка.image, настройкиПоискНомера.порогБинаризации, настройкиПоискНомера.процентЦветных, настройкиПоискНомера.процентЧерногоНиз, настройкиПоискНомера.процентЧерногоВерх, настройкиПоискНомера.соотношениеСторон, настройкиПоискНомера.отклонениеСторон);
            toolStripStatusLabel2.Text = "Номер найден за " + Convert.ToString((DateTime.Now - time).TotalSeconds) + "c ";
            pictureBox1.Image = поискПрямоугольника.output.ToBitmap();
            if (поискПрямоугольника.imageRectangle.Count > 0)
            {
                foreach (IplImage p in поискПрямоугольника.imageRectangle)
                {
                    поискСимволов = new SearchSymbol(p, настройкиПоискСимволов.порогБинаризации, настройкиПоискСимволов.радиус, настройкиПоискСимволов.размер, настройкиПоискСимволов.отклонениеРазмер, настройкиПоискСимволов.соотношениеСторон, настройкиПоискСимволов.отклонениеСторон);
                    if (поискСимволов.coordinatesRectangle.Count >= 5)
                    {
                        if (обучетьToolStripMenuItem.Checked)
                        {
                            Обучение f = new Обучение(this);

                            f.pictureBox1.Image = поискСимволов.изображениеПрямоугольников.ToBitmap();
                            f.ShowDialog();
                        }
                        else
                        {
                            pictureBox3.Image = поискСимволов.изображениеПрямоугольников.ToBitmap();
                            pictureBox2.Visible = true;
                            pictureBox2.Image = поискСимволов.output.ToBitmap();
                            string str = "";
                            /*foreach (IplImage po in поискСимволов.ИзображенияПрямоугольников)
                            {
                                Распознание р = new Распознание(po);
                                str += р.Символ;
 
                            }*/
                            toolStripStatusLabel2.Text += "символы найдены за " + Convert.ToString((DateTime.Now - time).TotalSeconds) + "c";

                            foreach (IplImage po in поискСимволов.imageRectangle)
                            {
                                double min = 100000000000;
                                char c = ' ';
                                foreach (MatrixSymbol m in матрицыСимволов)
                                {
                                    double u = m.compare(po);
                                    if (min > u)
                                    {
                                        min = u;
                                        c = m.symbol;
                                    }
                                }
                                str += c;
                            }
                            label1.Text = str;
                            label1.Visible = true;
                        }
                    }

                }

            }
            toolStripStatusLabel2.Text += "обработано за " + Convert.ToString((DateTime.Now - time).TotalSeconds) + "c";
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {

        }

        private void saveEduvationToolStripMenuItem_Click(object sender, EventArgs e)
        {
            XmlSerializer xml;
            FileStream stream;

            xml = new XmlSerializer(typeof(List<MatrixSymbol>));
            stream = new FileStream("Матрицы.xml", FileMode.Create, FileAccess.ReadWrite);
            xml.Serialize(stream, матрицыСимволов);
            stream.Close();
        }

        private void educatinToolStripMenuItem_Click(object sender, EventArgs e)
        {
            /*if (поискСимволов.coordinatesRectangle.Count >= 5)
            {
                Обучение f = new Обучение(this);

                f.pictureBox1.Image = поискСимволов.изображениеПрямоугольников.ToBitmap();
                f.ShowDialog();
            }*/

        }

        public void education(string text)
        {
            if (поискСимволов.coordinatesRectangle.Count == text.Length)
            {
                for (int i = 0; i < text.Length; i++)
                {
                    foreach (MatrixSymbol t in матрицыСимволов)
                        if (t.symbol == text[i]) t.add(поискСимволов.imageRectangle[i]);
                }
            }
        }

        private void videoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Symbol п = new Symbol();
            openFileDialog1.ShowDialog();
            label1.Visible = false;

            pictureBox2.Visible = false;


            if (File.Exists(openFileDialog1.FileName))
            {
                CvCapture capture = Cv.CreateFileCapture(openFileDialog1.FileName);
       

            }
              
            
        }

        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
    }
}
